package com.内部类.静态内部类;

public class StaticInnerClass01 {
    /***  静态类不能被实例化，只能通过外部类名访问
     * 1.可以访问外部类的所有静态成员，包括私有的，但不能直接访问外部类的非静态成员
     * 2.访问修饰符 默认 public protected private  都可以；
     * 3.作用域：整个类体；
     * 4.外部类访问静态内部类需要先创建对象才能调用 ；
     *
     * 5.1  Outer.Inner inner = new Outer.Inner();
     * 创建外部类对象直接访问静态内部类  new 外部类.内部类();
     * 5.2让外部类提供公共方法返回一个内部类； public Inner getInner() {   return new Inner();   }
     * Outer outer = new Outer();  //先创建外部类对象
     *        Outer.Inner inner1 = outer.getInner(); //用外部类提供的方法返回内部类对象
     * 5.3直接通过外部类名.静态方法 ，都不用创建外部类对象， public static Inner getInner02() {   return new Inner();   }
     *   Outer.Inner inner02 = Outer.getInner02();  //直接通过外部类静态方法访问静态内部类，不用创建外部类对象就可以用类名调用
     * 6.如果外部类和静态内部类的成员重名时，静态内部类访问的的话默认遵循就近原则，如果想访问外部类的成员则可以使用（外部类名.成员名)去访问
     */
    public static void main(String[] args) {
        new Outer().CreateInnerClass();
        new Test().say();
    }
}

class Outer {
    private int n1 = 10;
    private static int n2 = 20;
    private static String name = "jack";

    static class Inner {
      /**6.如果外部类和静态内部类的成员重名时，静态内部类访问的的话默认遵循就近原则，如果想访问外部类的成员则可以使用（外部类名.成员名)去访问*/
        private static String name = "韩顺平";
        void method() {
            /** 1.可以访问外部类的所有静态成员，包括私有的，但不能直接访问外部类的非静态成员*/
            System.out.println(n2);  // 可以访问静态成员
            System.out.println("静态内部类的name = "+name+"\t外部类的name = "+Outer.name);  // 可以访问静态成员
//            System.out.println(n1); //不能直接访问，因为是外部类的非静态成员
        }
    }

    public void CreateInnerClass() {  //外部类提供公共方法 创建一个内部类对象 调用其方法 ；
        Inner inner = new Inner();
        inner.method();
        System.out.println("=======================");
    }
    public  Inner getInner() {
        return new Inner();
    }
    public static Inner getInner02() {//直接通过外部类访问静态内部类
        return new Inner();
    }

}

class Test{
   void say(){
       Outer.Inner inner = new Outer.Inner(); //创建外部类对象直接访问静态内部类
       inner.method();
       System.out.println("=======================");
       Outer outer = new Outer();  //先创建外部类对象
       Outer.Inner inner1 = outer.getInner(); //用外部类提供的方法返回内部类对象
       inner1.method();
       System.out.println("=======================");
       Outer.Inner inner02 = Outer.getInner02();  //直接通过外部类访问静态内部类
       inner02.method();
   }
}